﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Web.Configuration;
using log4net;

namespace TheBullysStore.Models.ModuloAdministracion.Proveedor
{
    public class ProveedorDAO
    {
        public static String cadenaDB = WebConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;
        private static ILog log = LogManager.GetLogger(typeof(ProveedorDAO));
        public List<ProveedorBean> ListarProveedor(ProveedorBean proveedor)
        {
            SqlConnection sqlCon = null;
            try
            {
                List<ProveedorBean> listaProveedor = new List<ProveedorBean>();

                sqlCon = new SqlConnection(cadenaDB);

                sqlCon.Open();

                string commandString = "SELECT * FROM proveedor where estado=1";

                if (!string.IsNullOrEmpty(proveedor.RazonSocial))
                {
                    commandString += " AND RazonSocial LIKE '%" + proveedor.RazonSocial + "%'";
                }

                if (proveedor.RUC > 0)
                {
                    commandString += " AND RUC = " + proveedor.RUC;
                }


                if (proveedor.IdDepartamento > 0)
                {
                    commandString += " AND id_departamento = " + proveedor.IdDepartamento;
                }

                if (proveedor.IdProvincia > 0)
                {
                    commandString += " AND id_provincia = " + proveedor.IdProvincia;
                }

                if (proveedor.IdDistrito > 0)
                {
                    commandString += " AND id_distrito = " + proveedor.IdDistrito;
                }

                if (!string.IsNullOrEmpty(proveedor.Direccion))
                {
                    commandString += " AND Direccion LIKE '%" + proveedor.Direccion + "%'";
                }

                if (!string.IsNullOrEmpty(proveedor.Telefono))
                {
                    commandString += " AND Telefono LIKE '%" + proveedor.Telefono + "%'";
                }

                if (!string.IsNullOrEmpty(proveedor.PaginaWeb))
                {
                    commandString += " AND Pagina_Web LIKE '%" + proveedor.PaginaWeb + "%'";
                }

                if (!string.IsNullOrEmpty(proveedor.CargoContacto))
                {
                    commandString += " AND Cargo_Contacto LIKE '%" + proveedor.CargoContacto + "%'";
                }

                if (!string.IsNullOrEmpty(proveedor.Contacto))
                {
                    commandString += " AND Contacto LIKE '%" + proveedor.Contacto + "%'";
                }

                if (!string.IsNullOrEmpty(proveedor.Correo))
                {
                    commandString += " AND Correo LIKE '%" + proveedor.Correo + "%'";
                }

                if (!string.IsNullOrEmpty(proveedor.TelefonoContacto))
                {
                    commandString += " AND Telefono_Contacto LIKE '%" + proveedor.TelefonoContacto + "%'";
                }

                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                SqlDataReader dataReader = sqlCmd.ExecuteReader();

                while (dataReader.Read())
                {
                    ProveedorBean Proveedor = new ProveedorBean();
                    Proveedor.IdProveedor = Convert.ToInt32(dataReader["id_proveedor"]);
                    Proveedor.RazonSocial = Convert.ToString(dataReader["RazonSocial"]);
                    Proveedor.Direccion = Convert.ToString(dataReader["Direccion"]);
                    Proveedor.Telefono = Convert.ToString(dataReader["Telefono"]);
                    Proveedor.IdDistrito = Convert.ToInt32(dataReader["id_distrito"]);
                    Proveedor.Contacto = Convert.ToString(dataReader["contacto"]);
                    Proveedor.TelefonoContacto = Convert.ToString(dataReader["telefono_contacto"]);
                    Proveedor.Observaciones = Convert.ToString(dataReader["observaciones"]);
                    Proveedor.Correo = Convert.ToString(dataReader["correo"]);
                    Proveedor.CargoContacto = Convert.ToString(dataReader["cargo_contacto"]);
                    Proveedor.PaginaWeb = Convert.ToString(dataReader["pagina_web"]);
                    Proveedor.Estado = Convert.ToInt32(dataReader["estado"]);
                    Proveedor.RUC = Convert.ToDouble(dataReader["RUC"]);
                    Proveedor.IdProvincia = Convert.ToInt32(dataReader["id_provincia"]);
                    Proveedor.IdDepartamento = Convert.ToInt32(dataReader["id_departamento"]);
                    listaProveedor.Add(Proveedor);
                }
                dataReader.Close();                

                return listaProveedor;
            }
            catch (Exception ex)
            {
                log.Error("listarProveedor(EXCEPTION): ", ex);
                throw ex;
            }
            finally {
                sqlCon.Close();
            }
        }

        public Boolean ExisteProveedor(ProveedorBean proveedor)
        {
            SqlConnection sqlCon = null;
            try
            {

                sqlCon = new SqlConnection(cadenaDB);

                sqlCon.Open();

                string commandString = "SELECT * FROM Proveedor WHERE RUC = '" + proveedor.RUC + "' OR RazonSocial = '" + proveedor.RazonSocial + "' AND estado = 1";


                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                SqlDataReader dataReader = sqlCmd.ExecuteReader();

                if (dataReader.Read())
                {
                    dataReader.Close();
                    return true;
                }
                else
                {
                    
                    dataReader.Close();
                    return false;
                }
            }
            catch (Exception ex)
            {
                log.Error("existeProveedor(EXCEPTION): ", ex);
                throw ex;
            }
            finally {
                sqlCon.Close();
            }
        }

        /*public Boolean ExisteProveedorModificar(ProveedorBean proveedor)
        {
            try
            {
                String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;

                SqlConnection sqlCon = new SqlConnection(cadenaConfiguracion);

                sqlCon.Open();

                string commandString = "SELECT * FROM Proveedor WHERE RUC = '" + proveedor.RUC + "' OR RazonSocial = '" + proveedor.RazonSocial + "' AND estado = 1";


                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                SqlDataReader dataReader = sqlCmd.ExecuteReader();

                ProveedorBean aux = this.AtributosProveedor(proveedor);

                if (dataReader.Read())
                {
                    dataReader.Close();
                    sqlCon.Close();
                    return true;
                }
                else
                {
                    if ((aux.RUC == proveedor.RUC) && (aux.RazonSocial == proveedor.RazonSocial))
                    {
                        dataReader.Close();
                        sqlCon.Close();
                        return false;
                    }
                    else{
                        sqlCon.Close();
                        dataReader.Close();
                        return false;
                    }
                }
            }
            catch (Exception ex)
            {
                log.Error("existeProveedor(EXCEPTION): ", ex);
                throw ex;
            }
        }*/

        public string RegistrarProveedor(ProveedorBean proveedor)
        {
            SqlConnection sqlCon = null;
            try
            {

                sqlCon = new SqlConnection(cadenaDB);

                sqlCon.Open();

                string commandString = "INSERT INTO Proveedor (RazonSocial, RUC, Id_Departamento, Id_Provincia, Id_Distrito, Direccion, Telefono, Pagina_Web, Cargo_Contacto, Contacto, Correo, Telefono_Contacto, Observaciones, Estado) " +
                                      " VALUES ('" + proveedor.RazonSocial + "'," + proveedor.RUC + "," + proveedor.IdDepartamento + "," + proveedor.IdProvincia + "," + proveedor.IdDistrito + ",'" + proveedor.Direccion + "','" + proveedor.Telefono + "','" + proveedor.PaginaWeb + "','" + proveedor.CargoContacto + "','" + proveedor.Contacto + "','" + proveedor.Correo + "','" + proveedor.TelefonoContacto + "','" + proveedor.Observaciones + "',1)";

                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                sqlCmd.ExecuteNonQuery();
                
                proveedor.Conexion = "Bien";
            }
            catch (Exception ex)
            {
                log.Error("registrarProveedor(EXCEPTION): ", ex);
                throw ex;
            }
            finally {
                sqlCon.Close();
            }

            return proveedor.Conexion;
        }

        public string EliminarProveedor(ProveedorBean proveedor)
        {
            SqlConnection sqlCon = null;
            try
            {
                sqlCon = new SqlConnection(cadenaDB);

                sqlCon.Open();

                string commandString = "UPDATE Proveedor SET Estado = 0 WHERE Id_Proveedor = " + proveedor.IdProveedor + "";

                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                sqlCmd.ExecuteNonQuery();                

                proveedor.Conexion = "Bien";
            }
            catch (Exception ex)
            {
                log.Error("EliminarProveedor(EXCEPTION): ", ex);
                throw ex;
            }
            finally {
                sqlCon.Close();
            }

            return proveedor.Conexion;
        }

        public string ModificarProveedor(ProveedorBean proveedor)
        {
            SqlConnection sqlCon = null;
            try
            {
                sqlCon = new SqlConnection(cadenaDB);

                sqlCon.Open();

                string commandString = "UPDATE Proveedor SET " +
                                       "RazonSocial = '" + proveedor.RazonSocial + "', " +
                                       "RUC = " + proveedor.RUC + ", " +
                                       "Id_Departamento = " + proveedor.IdDepartamento + ", " +
                                       "Id_Provincia = " + proveedor.IdProvincia + ", " +
                                       "Id_Distrito = " + proveedor.IdDistrito + ", " +
                                       "Direccion = '" + proveedor.Direccion + "' , " +
                                       "Telefono = '" + proveedor.Telefono + "', " +
                                       "Pagina_Web = '" + proveedor.PaginaWeb + "', " +
                                       "Cargo_Contacto = '" + proveedor.CargoContacto + "', " +
                                       "Contacto = '" + proveedor.Contacto + "', " +
                                       "Correo = '" + proveedor.Correo + "', " +
                                       "Telefono_Contacto = '" + proveedor.TelefonoContacto + "', " +
                                       "Observaciones = '" + proveedor.Observaciones + "' " +
                                       "WHERE Id_Proveedor = " + proveedor.IdProveedor + "";

                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                sqlCmd.ExecuteNonQuery();
                
                proveedor.Conexion = "Bien";

            }
            catch (Exception ex)
            {
                log.Error("ModificarProveedor(EXCEPTION): ", ex);
                throw ex;
            }
            finally {
                sqlCon.Close();
            }
            return proveedor.Conexion;
        }

        public List<ProveedorBean> ListarProveedorMiguel(ProveedorBean proveedor)
        {
            SqlConnection sqlCon = null;
            try
            {
                List<ProveedorBean> listaProveedor = new List<ProveedorBean>();

                sqlCon = new SqlConnection(cadenaDB);

                sqlCon.Open();

                string commandString = "SELECT p.id_proveedor, p.RazonSocial, p.Direccion, d.Nombre, prov.Nombre, dist.Nombre, p.Telefono, p.id_distrito, p.contacto, p.telefono_contacto, p.observaciones," +
                                       " p.correo, p.cargo_contacto, p.pagina_web, p.estado, p.RUC, p.id_provincia, p.id_departamento" +
                                       " FROM proveedor p, edificio e, departamento_lugar d, provincia prov, distrito dist" +
                                       " WHERE p.estado=1 AND e.id_edificio = " + proveedor.IdEdificio + " AND d.id_departamento = p.id_departamento AND prov.id_provincia = p.id_provincia AND p.id_distrito = dist.id_distrito";

                if (!string.IsNullOrEmpty(proveedor.RazonSocial))
                {
                    commandString += " AND p.RazonSocial LIKE '%" + proveedor.RazonSocial + "%'";
                }

                if (proveedor.RUC > 0)
                {
                    commandString += " AND p.RUC = " + proveedor.RUC;
                }


                if (proveedor.IdDepartamento > 0)
                {
                    commandString += " AND p.id_departamento = " + proveedor.IdDepartamento;
                }
                else
                {
                    commandString += " AND (p.id_departamento = e.id_departamento OR p.id_departamento = 15)";
                }

                if (proveedor.IdProvincia > 0)
                {
                    commandString += " AND p.id_provincia = " + proveedor.IdProvincia;
                }
                else
                {
                    commandString += " AND (p.id_provincia = e.id_provincia OR p.id_provincia = 1501)";
                }

                if (proveedor.IdDistrito > 0)
                {
                    commandString += " AND p.id_distrito = " + proveedor.IdDistrito;
                }

                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                SqlDataReader dataReader = sqlCmd.ExecuteReader();

                while (dataReader.Read())
                {
                    ProveedorBean Proveedor = new ProveedorBean();
                    Proveedor.IdProveedor = Convert.ToInt32(dataReader["id_proveedor"]);
                    Proveedor.RazonSocial = Convert.ToString(dataReader["RazonSocial"]);
                    Proveedor.Direccion = Convert.ToString(dataReader["Direccion"]);
                    Proveedor.NombreDepartamento = Convert.ToString(dataReader[3]);
                    Proveedor.NombreProvincia = Convert.ToString(dataReader[4]);
                    Proveedor.NombreDistrito = Convert.ToString(dataReader[5]);
                    Proveedor.Telefono = Convert.ToString(dataReader["Telefono"]);
                    Proveedor.IdDistrito = Convert.ToInt32(dataReader["id_distrito"]);
                    Proveedor.Contacto = Convert.ToString(dataReader["contacto"]);
                    Proveedor.TelefonoContacto = Convert.ToString(dataReader["telefono_contacto"]);
                    Proveedor.Observaciones = Convert.ToString(dataReader["observaciones"]);
                    Proveedor.Correo = Convert.ToString(dataReader["correo"]);
                    Proveedor.CargoContacto = Convert.ToString(dataReader["cargo_contacto"]);
                    Proveedor.PaginaWeb = Convert.ToString(dataReader["pagina_web"]);
                    Proveedor.Estado = Convert.ToInt32(dataReader["estado"]);
                    Proveedor.RUC = Convert.ToDouble(dataReader["RUC"]);
                    Proveedor.IdProvincia = Convert.ToInt32(dataReader["id_provincia"]);
                    Proveedor.IdDepartamento = Convert.ToInt32(dataReader["id_departamento"]);
                    listaProveedor.Add(Proveedor);
                }
                dataReader.Close();

                return listaProveedor;
            }
            catch (Exception ex)
            {
                log.Error("listarProveedorMiguel(EXCEPTION): ", ex);
                throw ex;
            }
            finally {
                sqlCon.Close();
            }
        }

        public ProveedorBean AtributosProveedor(ProveedorBean proveedor)
        {
            SqlConnection sqlCon = null;
            try
            {

                sqlCon = new SqlConnection(cadenaDB);

                sqlCon.Open();

                string commandString = "SELECT * FROM Proveedor WHERE Id_Proveedor = " + proveedor.IdProveedor + "";

                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                SqlDataReader dataReader = sqlCmd.ExecuteReader();
                ProveedorBean Proveedor = new ProveedorBean();

                while (dataReader.Read())
                {

                    Proveedor.IdProveedor = Convert.ToInt32(dataReader["id_proveedor"]);
                    Proveedor.RazonSocial = Convert.ToString(dataReader["RazonSocial"]);
                    Proveedor.Direccion = Convert.ToString(dataReader["Direccion"]);
                    Proveedor.NombreDepartamento = Convert.ToString(dataReader[3]);
                    Proveedor.NombreProvincia = Convert.ToString(dataReader[4]);
                    Proveedor.NombreDistrito = Convert.ToString(dataReader[5]);
                    Proveedor.Telefono = Convert.ToString(dataReader["Telefono"]);
                    Proveedor.IdDistrito = Convert.ToInt32(dataReader["id_distrito"]);
                    Proveedor.Contacto = Convert.ToString(dataReader["contacto"]);
                    Proveedor.TelefonoContacto = Convert.ToString(dataReader["telefono_contacto"]);
                    Proveedor.Observaciones = Convert.ToString(dataReader["observaciones"]);
                    Proveedor.Correo = Convert.ToString(dataReader["correo"]);
                    Proveedor.CargoContacto = Convert.ToString(dataReader["cargo_contacto"]);
                    Proveedor.PaginaWeb = Convert.ToString(dataReader["pagina_web"]);
                    Proveedor.Estado = Convert.ToInt32(dataReader["estado"]);
                    Proveedor.RUC = Convert.ToDouble(dataReader["RUC"]);
                    Proveedor.IdProvincia = Convert.ToInt32(dataReader["id_provincia"]);
                    Proveedor.IdDepartamento = Convert.ToInt32(dataReader["id_departamento"]);

                }
                dataReader.Close();                

                return Proveedor;
            }
            catch (Exception ex)
            {
                log.Error("AtributosProveedor(EXCEPTION): ", ex);
                throw ex;
            }
            finally {
                sqlCon.Close();
            }
        }

    }
}